位操作是程序设计中对位模式按位或二进制数的一元和二元操作。 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多。 在现代架构中, 情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)
缺点:只能为整型和字符型数据
位运算主要是针对二进制进行的计算操作,其主要有:与 & 、非 !、或 | 、异或 ^ 、左移 > 和 右移 <
1.与 &
使用规律如下:两个操作数中位都为1,结果才为1,否则结果为0,例如:
1&1=1
1&0=0
0&1=0
0&0=0
---
001
101
---------------
001(结果)
结论1:两个数a和b(0<a<b)相与其结果范围是[0,a],包含0和a
应用场景:hashMap中让hashCode和map数组大小减一进行与操作,得到该key在数组中的位置角标值。
2.异或 ^
结论1:两个相同的数进行异或结果是0
应用场景:storm重arck机制,使用了该操作来判断任务是否完成。
其他:http://wenwen.m.sogou.com/mq/qudetail.jsp?qid=606323001&w=c%E8%AF%AD%E8%A8%80%E7%9A%84%E8%B4%9F%E5%80%BC%E7%9C%8B%E4%B8%8D%E6%87%82&g_ut=3
使用场景:基于位运算的权限设计
http://blog.csdn.net/ajian005/article/details/8490899
百度百科: http://baike.baidu.com/view/379209.htm
实例2:java中使用 byte数组要使用 & oxff 才能进行运算(sonar中的一个bug)相关介绍
http://blog.csdn.net/leonwang_fly/article/details/47422235
public static void main(String[] args) {
byte b=-1;
System.out.println((int)(char)b);
System.out.println((int)(char)(b & 0xff));
}
正如你所看到的:
第1个代码片段的运行结果是:-1
第2个代码片段的运行结果是:65535和255
3、左移(右移)符号
public static void main(String[] args) { //左移 2 * 2 的1次方 = 4 System.out.println(2<<1); //右移 2/2的1次方 = 1 System.out.println(2>>1); //无符号右移 2/2的1次方 = 1 System.out.println(2>>>1); //无符号右移 -2/2的1次方 = 2147483647 System.out.println(-2>>>1); }
用法javaPriorityQueue队列中的排序算法 (此处等同于除以2,但是比除2更加高效)
private void siftUpUsingComparator(int k, E x) { while (k > 0) {
//此处等同于除以2,但是比除2更加高效 int parent = (k - 1) >>> 1; Object e = queue[parent]; if (comparator.compare(x, (E) e) >= 0) break; queue[k] = e; k = parent; } queue[k] = x; }